home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / compiz < prev    next >
Text File  |  2009-10-20  |  12KB  |  458 lines

  1. #!/bin/sh
  2. # Compiz Manager wrapper script
  3. # Copyright (c) 2007 Kristian Lyngst├╕l <kristian@bohemians.org>
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  19. #
  20. #
  21. # Contributions by: Trevi├▒o (3v1n0) <trevi55@gmail.com>, Ubuntu Packages
  22. #
  23. # Much of this code is based on Beryl code, also licensed under the GPL.
  24. # This script will detect what options we need to pass to compiz to get it
  25. # started, and start a default plugin and possibly window decorator.
  26.  
  27.  
  28. COMPIZ_BIN_PATH="/usr/local/bin/" # For window decorators and compiz
  29. PLUGIN_PATH="/usr/local/lib/compiz/" 
  30. GLXINFO="/usr/bin/glxinfo"
  31. KWIN="/usr/bin/kwin"
  32. METACITY="/usr/bin/metacity"
  33. XFWM="/usr/bin/xfwm"
  34. COMPIZ_NAME="compiz" # Final name for compiz (compiz.real) 
  35.  
  36. # For Xgl LD_PRELOAD
  37. LIBGL_NVIDIA="/usr/lib/nvidia/libGL.so.1.2.xlibmesa"
  38. LIBGL_FGLRX="/usr/lib/fglrx/libGL.so.1.2.xlibmesa"
  39.  
  40. # Minimum amount of memory (in kilo bytes) that nVidia cards need
  41. # to be allowed to start
  42. # Set to 262144 to require 256MB
  43. NVIDIA_MEMORY="65536" # 64MB
  44. NVIDIA_SETTINGS="nvidia-settings" # Assume it's in the path by default
  45.  
  46. # For detecting what driver is in use, the + is for one or more /'s
  47. XORG_DRIVER_PATH="/usr/lib/xorg/modules/drivers/+"
  48. FALLBACKWM="xterm"
  49. if [ x"$KDE_FULL_SESSION" = x"true" ]; then 
  50.         FALLBACKWM="${KWIN}";
  51. elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then 
  52.         FALLBACKWM="${METACITY}"
  53. elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1; then 
  54.         FALLBACKWM="${XFWM}"
  55. fi
  56.  
  57. FALLBACKWM_OPTIONS="--replace $@"
  58.  
  59. # Driver whitelist
  60. WHITELIST="nvidia intel ati radeon radeonhd i810 fglrx"
  61.  
  62. # blacklist based on the pci ids 
  63. # See http://wiki.compiz-fusion.org/Hardware/Blacklist for details
  64. #T="   1002:5954 1002:5854 1002:5955" # ati rs480
  65. #T="$T 1002:4153" # ATI Rv350
  66. #T="$T 8086:2982 8086:2992 8086:29a2 8086:2a02 8086:2a12"  # intel 965
  67. #T="$T 8086:2a02 " # Intel GM965
  68. T="$T 8086:3577 8086:2562 " # Intel 830MG, 845G (LP: #259385)
  69. BLACKLIST_PCIIDS="$T"
  70. unset T
  71.  
  72. COMPIZ_OPTIONS="--ignore-desktop-hints --replace"
  73. COMPIZ_PLUGINS="move resize place decoration animation"
  74.  
  75. # Use emerald by default if it exist
  76. USE_EMERALD="yes"
  77.  
  78. # No indirect by default
  79. INDIRECT="no"
  80.  
  81. # Default X.org log if xset q doesn't reveal it
  82. XORG_DEFAULT_LOG="/var/log/Xorg.0.log"
  83.  
  84. # Set to yes to enable verbose
  85. VERBOSE="yes"
  86.  
  87. # Echos the arguments if verbose
  88. verbose()
  89. {
  90.     if [ "x$VERBOSE" = "xyes" ]; then
  91.         printf "$*"
  92.     fi
  93. }
  94.  
  95. # abort script and run fallback windowmanager
  96. abort_with_fallback_wm()
  97. {
  98.     if [ "x$SKIP_CHECKS" = "xyes" ]; then
  99.         verbose "SKIP_CHECKS is yes, so continuing despite problems.\n"
  100.         return 0;
  101.     fi
  102.     
  103.     if [ "x$CM_DRY" = "xyes" ]; then
  104.         verbose "Dry run failed: Problems detected with 3D support.'n"
  105.         exit 1;
  106.     fi
  107.  
  108.     verbose "aborting and using fallback: $FALLBACKWM \n"
  109.  
  110.     if [ -x $FALLBACKWM ]; then
  111.         exec $FALLBACKWM $FALLBACKWM_OPTIONS
  112.     else
  113.         printf "no $FALLBACKWM found, exiting\n"
  114.         exit 1
  115.     fi
  116. }
  117.  
  118. # Check if we run with the Software Rasterizer, this happens e.g.
  119. # when a second screen session is opened via f-u-a on intel
  120. check_software_rasterizer()
  121. {
  122.     verbose "Checking for Software Rasterizer: "
  123.     if glxinfo 2> /dev/null | egrep -q '^OpenGL renderer string: Software Rasterizer' ; then
  124.         verbose "present. \n";
  125.         return 0;
  126.     else
  127.         verbose "Not present. \n"
  128.         return 1;
  129.     fi
  130.  
  131. }
  132.  
  133. # Check for non power of two texture support
  134. check_npot_texture()
  135. {
  136.     verbose "Checking for non power of two support: "
  137.     if glxinfo 2> /dev/null | egrep -q '(GL_ARB_texture_non_power_of_two|GL_NV_texture_rectangle|GL_EXT_texture_rectangle|GL_ARB_texture_rectangle)' ; then
  138.         verbose "present. \n";
  139.         return 0;
  140.     else
  141.         verbose "Not present. \n"
  142.         return 1;
  143.     fi
  144.  
  145. }
  146.  
  147. # Check for presence of FBConfig
  148. check_fbconfig()
  149. {
  150.     verbose "Checking for FBConfig: "
  151.     if [ "$INDIRECT" = "yes" ]; then
  152.         $GLXINFO -i | grep -q GLX.*fbconfig 
  153.         FB=$?
  154.     else
  155.         $GLXINFO | grep -q GLX.*fbconfig 
  156.         FB=$?
  157.     fi
  158.  
  159.     if [ $FB = "0" ]; then
  160.         unset FB
  161.         verbose "present. \n"
  162.         return 0;
  163.     else
  164.         unset FB
  165.         verbose "not present. \n"
  166.         return 1;
  167.     fi
  168. }
  169.  
  170.  
  171. # Check for TFP
  172. check_tfp()
  173. {
  174.     verbose "Checking for texture_from_pixmap: "
  175.     if [ $($GLXINFO 2>/dev/null | grep -c GLX_EXT_texture_from_pixmap) -gt 2 ] ; then
  176.         verbose "present. \n"
  177.         return 0;
  178.     else
  179.         verbose "not present. \n"
  180.         if [ "$INDIRECT" = "yes" ]; then
  181.             unset LIBGL_ALWAYS_INDIRECT
  182.             INDIRECT="no"
  183.             return 1;
  184.         else
  185.             verbose "Trying again with indirect rendering:\n";
  186.             INDIRECT="yes"
  187.             export LIBGL_ALWAYS_INDIRECT=1
  188.             check_tfp;
  189.             return $?
  190.         fi
  191.     fi
  192. }
  193.  
  194. # Check wether the composite extension is present
  195. check_composite()
  196. {
  197.     verbose "Checking for Composite extension: "
  198.     if xdpyinfo -queryExtensions | grep -q Composite ; then
  199.         verbose "present. \n";
  200.         return 0;
  201.     else
  202.         verbose "not present. \n";
  203.         return 1;
  204.     fi
  205. }
  206.  
  207. # Detects if Xgl is running
  208. check_xgl()
  209. {
  210.     verbose "Checking for Xgl: "
  211.     if xvinfo | grep -q Xgl ; then
  212.         verbose "present. \n"
  213.         return 0;
  214.     else
  215.         verbose "not present. \n"
  216.         return 1;
  217.     fi
  218. }
  219.  
  220. # Check if the nVidia card has enough video ram to make sense
  221. check_nvidia_memory()
  222. {
  223.     if [ ! -x "$NVIDIA_SETTINGS" ]; then
  224.         return 0
  225.     fi
  226.  
  227.     MEM=$(${NVIDIA_SETTINGS} -q VideoRam | egrep Attribute\ \'VideoRam\'\ .*: | cut -d: -f3 | sed 's/[^0-9]//g')
  228.     if [ $MEM -lt $NVIDIA_MEMORY ]; then
  229.         verbose "Less than ${NVIDIA_MEMORY}kb of memory and nVidia";
  230.         return 1;
  231.     fi
  232.     return 0;
  233. }
  234.  
  235. # Check for existence if NV-GLX
  236. check_nvidia()
  237. {
  238.     if [ ! -z $NVIDIA_INTERNAL_TEST ]; then
  239.         return $NVIDIA_INTERNAL_TEST;
  240.     fi
  241.     verbose "Checking for nVidia: "
  242.     if xdpyinfo | grep -q NV-GLX ; then
  243.         verbose "present. \n"
  244.         NVIDIA_INTERNAL_TEST=0
  245.         return 0;
  246.     else
  247.         verbose "not present. \n"
  248.         NVIDIA_INTERNAL_TEST=1
  249.         return 1;
  250.     fi
  251. }
  252.  
  253. # Check if the max texture size is large enough compared to the resolution
  254. check_texture_size()
  255. {
  256.     # Check how many screens we've got and iterate over them
  257.     N=$(xdpyinfo | grep -i "number of screens" | sed 's/.*[^0-9]//g')
  258.     for i in $(seq 1 $N); do
  259.         verbose "Checking screen $i"
  260.         TEXTURE_LIMIT=$(glxinfo -l | grep GL_MAX_TEXTURE_SIZE | sed -n "$i s/^.*=[^0-9]//g p")
  261.         RESOLUTION=$(xdpyinfo | grep -i dimensions: | sed -n -e "$i s/^ *dimensions: *\([0-9]*x[0-9]*\) pixels.*/\1/ p")
  262.         VRES=$(echo $RESOLUTION | sed 's/.*x//')
  263.         HRES=$(echo $RESOLUTION | sed 's/x.*//')
  264.         verbose "Comparing resolution ($RESOLUTION) to maximum 3D texture size ($TEXTURE_LIMIT): ";
  265.         if [ $VRES -gt $TEXTURE_LIMIT ] || [ $HRES -gt $TEXTURE_LIMIT ]; then
  266.         verbose "Failed.\n"
  267.         return 1;
  268.         fi
  269.         verbose "Passed.\n"
  270.     done
  271.     return 0
  272. }
  273.  
  274. # check driver whitelist
  275. running_under_whitelisted_driver()
  276. {
  277.     LOG=$(xset q|grep "Log file"|awk '{print $3}')
  278.     if [ "$LOG" = "" ]; then
  279.         XORG_CURRENT_LOG="/var/log/Xorg.$(echo $DISPLAY | cut -d : -f2 | sed "s/\..*//g").log"
  280.         if [ -f $XORG_CURRENT_LOG ]; then
  281.             verbose "xset q doesn't reveal the location of the log file. Using fallback $XORG_CURRENT_LOG \n"
  282.             LOG=$XORG_CURRENT_LOG;
  283.         else
  284.             verbose "xset q doesn't reveal the location of the log file. Using fallback $XORG_DEFAULT_LOG \n"
  285.             LOG=$XORG_DEFAULT_LOG;
  286.         fi
  287.     fi
  288.     if [ -z "$LOG" ];then
  289.         verbose "AIEEEEH, no Log file found \n"
  290.         verbose "$(xset q) \n"
  291.     return 0
  292.     fi
  293.     for DRV in ${WHITELIST}; do
  294.         if egrep -q "Loading ${XORG_DRIVER_PATH}${DRV}_drv\.so" $LOG &&
  295.            ! egrep -q "Unloading ${XORG_DRIVER_PATH}${DRV}_drv\.so" $LOG; 
  296.         then
  297.             return 0
  298.         fi
  299.     done
  300.     verbose "No whitelisted driver found\n"
  301.     return 1
  302. }
  303.  
  304. # check pciid blacklist
  305. have_blacklisted_pciid()
  306. {
  307.     OUTPUT=$(lspci -n)
  308.     for ID in ${BLACKLIST_PCIIDS}; do
  309.         if echo "$OUTPUT" | egrep -q "$ID"; then
  310.             verbose "Blacklisted PCIID '$ID' found \n"
  311.             return 0
  312.         fi
  313.     done
  314.     OUTPUT=$(lspci -vn | grep -i VGA)
  315.     verbose "Detected PCI ID for VGA: $OUTPUT\n"
  316.     return 1
  317. }
  318.  
  319. build_env()
  320. {
  321.     if check_nvidia; then
  322.         export __GL_YIELD=NOTHING
  323.     fi
  324.     if [ "$INDIRECT" = "yes" ]; then
  325.         export LIBGL_ALWAYS_INDIRECT=1
  326.     fi
  327.     if check_xgl; then
  328.         if [ -f ${LIBGL_NVIDIA} ]; then
  329.             export LD_PRELOAD="${LD_PRELOAD:+${LD_PRELOAD} }${LIBGL_NVIDIA}"
  330.             verbose "Enabling Xgl with nVidia drivers...\n"
  331.         fi
  332.         if [ -f ${LIBGL_FGLRX} ]; then
  333.             export LD_PRELOAD="${LD_PRELOAD:+${LD_PRELOAD} }${LIBGL_FGLRX}"
  334.             verbose "Enabling Xgl with fglrx ATi drivers...\n"
  335.         fi
  336.     fi
  337.  
  338.     export FROM_WRAPPER=yes
  339. }
  340.  
  341. build_args()
  342. {
  343.     if [ "x$INDIRECT" = "xyes" ]; then
  344.         COMPIZ_OPTIONS="$COMPIZ_OPTIONS --indirect-rendering "
  345.     fi
  346.     if [ ! -z "$DESKTOP_AUTOSTART_ID" ]; then
  347.         COMPIZ_OPTIONS="$COMPIZ_OPTIONS --sm-client-id $DESKTOP_AUTOSTART_ID"
  348.     fi
  349.     if check_nvidia; then
  350.         if [ "x$INDIRECT" != "xyes" ]; then
  351.             COMPIZ_OPTIONS="$COMPIZ_OPTIONS --loose-binding"
  352.         fi
  353.     fi
  354. }
  355.  
  356. ####################
  357. # Execution begins here.
  358.  
  359. # Read configuration from XDG paths
  360. if [ -z "$XDG_CONFIG_DIRS" ]; then
  361.     test -f /etc/xdg/compiz/compiz-manager && . /etc/xdg/compiz/compiz-manager
  362.     for f in /etc/xdg/compiz/compiz-manager.d/*; do
  363.         test -e $f && . $f
  364.     done
  365. else
  366.     OLD_IFS=$IFS
  367.     IFS=:
  368.     for CONFIG_DIR in $XDG_CONFIG_DIRS
  369.     do
  370.         test -f $CONFIG_DIR/compiz/compiz-manager && . $CONFIG_DIR/compiz/compiz-manager
  371.         for f in $CONFIG_DIRS/compiz/compiz-manager.d/*; do
  372.             test -e $f && . $f
  373.         done
  374.     done
  375.     IFS=$OLD_IFS
  376.     unset OLD_IFS
  377. fi
  378.  
  379. if [ -z "$XDG_CONFIG_HOME" ]; then
  380.     test -f $HOME/.config/compiz/compiz-manager && . $HOME/.config/compiz/compiz-manager
  381. else
  382.     test -f $XDG_CONFIG_HOME/compiz/compiz-manager && .  $XDG_CONFIG_HOME/compiz/compiz-manager
  383. fi
  384.  
  385. # Don't use compiz when running the failsafe session
  386. if [ "x$GNOME_DESKTOP_SESSION_ID" = "xFailsafe" ]; then
  387.     abort_with_fallback_wm
  388. fi
  389.  
  390. if [ "x$LIBGL_ALWAYS_INDIRECT" = "x1" ]; then
  391.     INDIRECT="yes";
  392. fi
  393.  
  394. # if we run under Xgl, we can skip some tests here
  395. if ! check_xgl; then
  396.     # if vesa or vga are in use, do not even try glxinfo (LP#119341)
  397.     if ! running_under_whitelisted_driver || have_blacklisted_pciid; then
  398.         abort_with_fallback_wm
  399.     fi
  400.     # check if we have the required bits to run compiz and if not, 
  401.     # fallback
  402.     if ! check_tfp || ! check_npot_texture || ! check_composite || ! check_texture_size; then
  403.         abort_with_fallback_wm
  404.     fi
  405.  
  406.     # check if we run with software rasterizer and if so, bail out
  407.     if check_software_rasterizer; then
  408.         verbose "Software rasterizer detected, aborting"
  409.         abort_with_fallback_wm
  410.     fi
  411.  
  412.     if check_nvidia && ! check_nvidia_memory; then
  413.         abort_with_fallback_wm
  414.     fi
  415.  
  416.     if ! check_fbconfig; then
  417.         abort_with_fallback_wm
  418.     fi
  419. fi
  420.  
  421. # load the ccp plugin if present and fallback to plain gconf if not
  422. if [ -f ${PLUGIN_PATH}libccp.so ]; then
  423.     COMPIZ_PLUGINS="$COMPIZ_PLUGINS ccp"
  424. elif [ -f ${PLUGIN_PATH}libgconf.so ]; then
  425.     COMPIZ_PLUGINS="$COMPIZ_PLUGINS glib gconf"
  426. fi
  427.  
  428. # enable gnomecompat if we run under gnome
  429. if [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ] && [ ! -e ~/.compiz-gnomecompat ]; then 
  430.     verbose "running under gnome seesion, checking for gnomecompat\n"
  431.     if ! gconftool -g /apps/compiz/general/allscreens/options/active_plugins|grep -q gnomecompat; then
  432.         verbose "adding missing gnomecompat\n"
  433.         V=$(gconftool -g /apps/compiz/general/allscreens/options/active_plugins|sed s/mousepoll,/mousepoll,gnomecompat,/)
  434.         if ! echo $V|grep -q gnomecompat; then
  435.             verbose "can not add gnomecompat, reseting\n"
  436.             gconftool --unset /apps/compiz/general/allscreens/options/active_plugins
  437.         else
  438.             gconftool -s /apps/compiz/general/allscreens/options/active_plugins --type list --list-type=string $V
  439.         fi
  440.         touch ~/.compiz-gnomecompat
  441.     fi
  442. fi
  443.  
  444. # get environment
  445. build_env
  446. build_args
  447.  
  448. if [ "x$CM_DRY" = "xyes" ]; then
  449.     verbose "Dry run finished: everything should work with regards to Compiz and 3D.\n"
  450.     verbose "Execute: ${COMPIZ_BIN_PATH}${COMPIZ_NAME} $COMPIZ_OPTIONS "$@" $COMPIZ_PLUGINS \n"
  451.     exit 0;
  452. fi
  453.  
  454. ${COMPIZ_BIN_PATH}${COMPIZ_NAME} $COMPIZ_OPTIONS "$@" $COMPIZ_PLUGINS || exec $FALLBACKWM $FALLBACKWM_OPTIONS
  455.  
  456.